package com.codeyang.aspect;

import com.codeyang.utils.AjaxResult;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描述: spring mvc 全局异常处理器
 * | mvc 中也自带了一个异常的处理器,我们这里就是代替它
 *
 * @author CodeYang_Site
 * @version 2021/4/21 10:40
 */
// 针对controller 的全局异常增强 返回json
@RestControllerAdvice
public class GlobalExceptionHandler {


    /**
     * 拦截 MethodArgumentNotValidException  json请求转换校验的异常 的异常 -- 校验异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public AjaxResult methodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        return validateException(bindingResult);

    }

    /**
     * 处理 org.springframework.validation.BindException 绑定的异常校验
     *
     * @param bindException
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    public AjaxResult bindException(BindException bindException) {
        BindingResult bindingResult = bindException.getBindingResult();
        return validateException(bindingResult);
    }

    /**
     * 异常处理
     *
     * @param bindingResult 绑定的异常结果
     * @return
     */
    private AjaxResult validateException(BindingResult bindingResult) {
        //1 获取当前绑定的异常 的全部内容
        List<ObjectError> allErrors = bindingResult.getAllErrors();

        List<Map<String, Object>> list = new ArrayList<>();
        // 2 构建异常输出信息
        for (ObjectError allError : allErrors) {
            HashMap<String, Object> map = new HashMap<>();
            // 异常对象
            map.put("objectName", allError.getObjectName());
            // 转换一下字段异常  获取是哪个字段异常
            FieldError fieldError = (FieldError) allError;
            map.put("field", fieldError.getField());
            map.put("defaultMessage", allError.getDefaultMessage());
            // 这里可能有很多校验失败异常
            list.add(map);
        }

        return AjaxResult.fail("后端校验异常,请查看data", list);
    }


}
